﻿//================================================
//
//                       _oo0oo_
//                      o8888888o
//                      88" . "88
//                      (| -_- |)
//                      0\  =  /0
//                    ___/`---'\___
//                  .' \\|     |// '.
//                 / \\|||  :  |||// \
//                / _||||| -:- |||||- \
//               |   | \\\  -  /// |   |
//               | \_|  ''\---/''  |_/ |
//               \  .-\__  '-'  ___/-. /
//             ___'. .'  /--.--\  `. .'___
//          ."" '<  `.___\_<|>_/___.' >' "".
//         | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//         \  \ `_.   \_ __\ /__ _/   .-` /  /
//     =====`-.____`.___ \_____/___.-`___.-'=====
//                       `=---='
//
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//               佛祖保佑         永无BUG
//
//
//
//================================================
//
// Created by Huiyi on 2021/4/20.
//
//@模块名称 易炫彩文本操作库
//@依赖   module_base.h
//@版本   1.4
//@日期   2022-10-14
//@作者   Huiyi
//@模块备注 封装文本相关处理函数
//项目gitee地址 https://gitee.com/LoveA/XL_XExpand
//大部分代码已经历过粗略测试
//如发现BUG可提交issues
//https://gitee.com/LoveA/XL_XExpand
//反馈QQ群:594165459

#pragma once

#ifndef XL_XEXPAND_STRING_H
//@隐藏{
#define XL_XEXPAND_STRING_H    //防止复用

#if XC_MOUDLE
#include "module_base.h"
#endif
//@隐藏}
#include <Regex>

//@src  "string.cpp"
//@src  "StringClassRegex.cpp"


// TODO: 文本操作
//@分组{  文本操作

//@参数   随机长度
//@别名   文本_取随机文本A (长度)
CXTextA X_String_GetRandStrA (int len);
//@参数   随机长度
//@别名   文本_取随机文本 (长度)
CXText X_String_GetRandStr (int len);

//@参数   字符串
//@别名   文本_转小写A (文本)
CXTextA X_String_ToLowerA(CXTextA str);
//@参数   字符串
//@别名   文本_转小写 (文本)
CXText X_String_ToLower(CXText str);

//@参数   字符串
//@别名   文本_转大写A (文本)
CXTextA X_String_ToUpperA(CXTextA str);
//@参数   字符串
//@别名   文本_转大写 (文本)
CXText X_String_ToUpper(CXText str);

//@别名   文本_文本比较A (待比较文本一,待比较文本二,是否区分大小写)
int X_String_StrCmpA(CXTextA str1,CXTextA str2,bool ifnotcasesensitive = false);
//@别名   文本_文本比较 (待比较文本一,待比较文本二,是否区分大小写)
int X_String_StrCmp(CXText str1,CXText str2,bool ifnotcasesensitive = false);

//@别名   文本_取中间文本A(源文本,前文本,后文本,起始位置,是否不区分大小写)
CXTextA X_String_GetMiddleTextA(CXTextA text,CXTextA start,CXTextA end,int begin=0,bool ifnotcasesensitive=false);
//@别名   文本_取中间文本(源文本,前文本,后文本,起始位置,是否不区分大小写)
CXText X_String_GetMiddleText(CXText text,CXText start,CXText end,int begin=0,bool ifnotcasesensitive=false);

//@别名   文本_删首尾空A(文本)
CXTextA X_String_TrimA(CXTextA str);
//@别名   文本_删首尾空(文本)
CXText X_String_Trim(CXText str);

//@别名   文本_子文本替换A (源字符串,被替换字符串,用作替换的字符串,起始位置,最大替换次数)
CXTextA X_String_SubreplaceA(CXTextA resource_str, CXTextA sub_str, CXTextA new_str="",int begin=0,int MaxRep=-1);
//@别名   文本_子文本替换 (源字符串,被替换字符串,用作替换的字符串,起始位置,最大替换次数)
CXText X_String_Subreplace(CXText resource_str, CXText sub_str, CXText new_str=L"",int begin=0,int MaxRep=-1);

//@别名   文本_倒找文本A(源字符串,被寻找字符串,起始位置)
int X_String_RfindA(CXTextA source ,CXTextA str,int pos=-1);
//@别名   文本_倒找文本(源字符串,被寻找字符串,起始位置)
int X_String_Rfind(CXText source ,CXText str,int pos=-1);

//@别名   文本_取左边A ()
CXTextA X_String_GetLeftA(CXTextA text,CXTextA str,int pos=-1);
//@别名   文本_取左边 ()
CXText X_String_GetLeft(CXText text,CXText str,int pos=-1);

//@别名   文本_取右边A ()
CXTextA X_String_GetRightA(CXTextA text,CXTextA str,int pos=-1);
//@别名   文本_取右边 ()
CXText X_String_GetRight(CXText text,CXText str,int pos=-1);

//@别名   文本_分割文本A (文本,分割字符,返回数组)
CXVector<CXTextA> X_String_SplitWithStlA(CXTextA str, CXTextA pattern);
//@别名   文本_分割文本 (文本,分割字符,返回数组)
CXVector<CXText> X_String_SplitWithStl(CXText str, CXText pattern);

//@别名   文本_是否UTF8(欲判断的文本)
bool X_String_WIsUtf8A(const CXTextA& string);

//@别名   文本_逐字分割(被分割的文本,接收的容器)
int  X_String_SplitWitNum(CXText string, CXVector<CXText>& rList);
//@别名   文本_逐字分割A(被分割的文本,接收的容器)
int  X_String_SplitWitNumA(CXTextA string, CXVector<CXTextA>& rList);

//@备注   用于判断文本是否为标准数值格式(不支持科学计数法)
//@别名   文本_是否为数值(待判断文本)
bool X_String_IsNumber(CXText string);

/*@声明
//@别名   文本_数值到文本(欲转换的数值)
CXText X_String_NumberToText(...);
//@别名   文本_数值到文本A(欲转换的数值)
CXTextA X_String_NumberToTextA(...);
*/
//@别名   文本_文本到整型(欲转换的文本)
int X_String_TextToInt(CXText str);
//@别名   文本_文本到长整型(欲转换的文本)
long X_String_TextToLong(CXText str);
//@别名   文本_文本到双长整型(欲转换的文本)
LONGLONG X_String_TextToLongLong(CXText str);
//@别名   文本_文本到整型A(欲转换的文本)
int X_String_TextToIntA(CXTextA str);
//@别名   文本_文本到长整型A(欲转换的文本)
long X_String_TextToLongA(CXTextA str);
//@别名   文本_文本到双长整型A(欲转换的文本)
LONGLONG X_String_TextToLongLongA(CXTextA str);
//@隐藏{
CXText X_String_NumberToText(int x);
CXText X_String_NumberToText(long x);
CXText X_String_NumberToText(long long x);
CXText X_String_NumberToText(float x);
CXText X_String_NumberToText(double x);
CXText X_String_NumberToText(long double x);
CXText X_String_NumberToText(unsigned int x);
CXText X_String_NumberToText(unsigned long x);
CXText X_String_NumberToText(unsigned long long x);
CXTextA X_String_NumberToTextA(int x);
CXTextA X_String_NumberToTextA(long x);
CXTextA X_String_NumberToTextA(long long x);
CXTextA X_String_NumberToTextA(float x);
CXTextA X_String_NumberToTextA(double x);
CXTextA X_String_NumberToTextA(long double x);
CXTextA X_String_NumberToTextA(unsigned int x);
CXTextA X_String_NumberToTextA(unsigned long x);
CXTextA X_String_NumberToTextA(unsigned long long x);
//@隐藏}

//@别名 str返回 Str，注意本命令对首字为汉字的文本无效
//@别名 文本_首字母改大写(英文文本)
CXText X_String_LastToUpper(CXText str);
//@别名 str返回 Str，注意本命令对首字为汉字的文本无效
//@别名 文本_首字母改大写A(英文文本)
CXTextA X_String_LastToUpperA(CXTextA str);


//@分组}  文本操作
//@分组{  其他

//@别名 正则表达式类A
class X_String_RegexA {
private:
	std::regex* m_regex;
	std::regex_constants::syntax_option_type m_option;
	CXTextA m_expression;
	std::string m_searchStr;
	bool m_icase;
	void reint();
public:
	X_String_RegexA();
	X_String_RegexA(CXTextA);
	X_String_RegexA(CXTextA, CXTextA);
	~X_String_RegexA();

	//@别名 置表达式(表达式)
	void SetEexpression(CXTextA exp);

	//@别名 置大小写模式(是否区分大小写)
	void SetICase(bool icase);

	//@别名 置匹配文本(用于匹配的文本)
	void SetSearchStr(CXTextA str);

	//@备注 用于检查文本是否复合表达式
	//@别名 验证文本()
	bool CheckStr();

	//@备注 取出该正则匹配到的文本
	//@参数 匹配索引 索引值从0开始
	//@参数 起始位置 起始匹配位置
	//@别名 匹配(匹配索引,起始位置)
	CXTextA Search(UINT index=0,UINT begin=0);

	//@备注 取出该正则匹配到的文本
	//@参数 匹配索引 索引值从0开始
	//@参数 子成员索引 索引值从0开始
	//@参数 起始位置 起始匹配位置
	//@别名 匹配子文本(匹配索引,子成员索引,起始位置)
	CXTextA SearchSub(UINT index, UINT SubIndex, UINT begin = 0);

	//@备注 取出该正则匹配到的文本
	//@参数 返回数组 用于接收结果的数组
	//@参数 匹配索引 索引值从0开始
	//@参数 起始位置 起始匹配位置
	//@别名 匹配所有(返回数组,匹配索引,起始位置)
	UINT SearchAll(CXVector<CXTextA>& ret, UINT index=0, UINT begin=0);

	//@别名 取匹配数量()
	UINT GetSearchCount();

	//@备注 替换在正则表达式查找中找到的文本
	//@返回 替换后的文本
	//@参数 用作替换的文本
	//@别名 替换(用作替换的文本)
	CXTextA Replace(CXTextA str);
};

//@别名 正则表达式类
class X_String_Regex {
private:
	std::wregex* m_regex;
	std::regex_constants::syntax_option_type m_option;
	CXText m_expression;
	std::wstring m_searchStr;
	bool m_icase;
	void reint();
public:
	X_String_Regex();
	X_String_Regex(CXText);
	X_String_Regex(CXText, CXText);
	~X_String_Regex();

	//@别名 置表达式(表达式)
	void SetEexpression(CXText exp);

	//@别名 置大小写模式(是否区分大小写)
	void SetICase(bool icase);

	//@别名 置匹配文本(用于匹配的文本)
	void SetSearchStr(CXText str);

	//@备注 用于检查文本是否复合表达式
	//@别名 验证文本()
	bool CheckStr();

	//@备注 取出该正则匹配到的文本
	//@参数 匹配索引 索引值从0开始
	//@参数 起始位置 起始匹配位置
	//@别名 匹配(匹配索引,起始位置)
	CXText Search(UINT index = 0, UINT begin = 0);

	//@备注 取出该正则匹配到的文本
	//@参数 匹配索引 索引值从0开始
	//@参数 子成员索引 索引值从0开始
	//@参数 起始位置 起始匹配位置
	//@别名 匹配子文本(匹配索引,子成员索引,起始位置)
	CXText SearchSub(UINT index, UINT SubIndex, UINT begin = 0);

	//@备注 取出该正则匹配到的文本
	//@参数 返回数组 用于接收结果的数组
	//@参数 匹配索引 索引值从0开始
	//@参数 起始位置 起始匹配位置
	//@别名 匹配所有(返回数组,匹配索引,起始位置)
	UINT SearchAll(CXVector<CXText>& ret, UINT index = 0, UINT begin = 0);

	//@别名 取匹配数量()
	UINT GetSearchCount();

	//@备注 替换在正则表达式查找中找到的文本
	//@返回 替换后的文本
	//@参数 用作替换的文本
	//@别名 替换(用作替换的文本)
	CXText Replace(CXText str);
};

//@分组}  其他
//@隐藏{
#ifdef _WIN64
typedef __int64 XCLPTR;
#else
typedef int XCLPTR;
#endif
//@隐藏}

#endif //XL_XEXPAND_STRING_H
